package pe.gob.osinergmin.interfase_siaf.dac.certificacion.service.impl;

import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.gob.osinergmin.interfase_siaf.dac.certificacion.dao.CertCabDao;
import pe.gob.osinergmin.interfase_siaf.dac.certificacion.dao.CertDetDao;
import pe.gob.osinergmin.interfase_siaf.dac.certificacion.service.ValidacionCertifService;
import pe.gob.osinergmin.interfase_siaf.dac.dao.CertificadoFaseDao;
import pe.gob.osinergmin.interfase_siaf.dac.dao.CertificadoSecuenciaDao;
import pe.gob.osinergmin.interfase_siaf.dac.dao.FuenteFinancDao;
import pe.gob.osinergmin.interfase_siaf.dac.dao.MaestroClasificadorDao;
import pe.gob.osinergmin.interfase_siaf.dac.dao.MaestroDetalleDao;
import pe.gob.osinergmin.interfase_siaf.dac.dao.MaestroDocumentoDao;
import pe.gob.osinergmin.interfase_siaf.dac.dao.MetaDao;
import pe.gob.osinergmin.interfase_siaf.dac.domain.CertificadoFase;
import pe.gob.osinergmin.interfase_siaf.dac.domain.CertificadoSecuencia;
import pe.gob.osinergmin.interfase_siaf.dac.domain.Ejecutora;
import pe.gob.osinergmin.interfase_siaf.dac.domain.FuenteFinanc;
import pe.gob.osinergmin.interfase_siaf.dac.domain.MaestroClasificador;
import pe.gob.osinergmin.interfase_siaf.dac.domain.MaestroDetalle;
import pe.gob.osinergmin.interfase_siaf.dac.domain.MaestroDocumento;
import pe.gob.osinergmin.interfase_siaf.dac.domain.Meta;
import pe.gob.osinergmin.interfase_siaf.dac.domain.interfase.CertCab;
import pe.gob.osinergmin.interfase_siaf.dac.domain.interfase.CertDet;
import pe.gob.osinergmin.interfase_siaf.dac.util.Constantes;

@Service("validacionCertifService")
public class ValidacionCertifServiceImpl implements ValidacionCertifService {
	
	private final Log logger = LogFactory.getLog(getClass());
	
	public static final String CODIGO_VERIFICACION_OK ="1";
	public static final String CODIGO_VERIFICACION_ERROR ="0";
	public static final String ESTADO_ENVIO_P ="P";
	public static final String ESTADO_ENVIO_N ="N";
	public static final String ESTADO_ENVIO_R ="R";
	
	
	@Autowired
	private CertCabDao certCabDao;
	
	@Autowired
	private CertDetDao certDetDao;
	
	@Autowired
	private MaestroDocumentoDao  maestroDocumentoDao;
	
	@Autowired
	private MaestroDetalleDao maestroDetalleDao;	
	
	@Autowired
	private FuenteFinancDao fuenteFinancDao;
	
	@Autowired
	private MaestroClasificadorDao maestroClasificadorDao;
	
	@Autowired
	private CertificadoSecuenciaDao certificadoSecuenciaDao;
	
	@Autowired
	private CertificadoFaseDao certificadoFaseDao;
	
	@Autowired
	private MetaDao metaDao;
	
	
	/*******VALIDACION PARA CERTIFICACION NUEVO*********/
	
	@Override	
	@SuppressWarnings("unchecked")
	public String validarCertificacionNuevo(Map<String, Object> params) throws Exception {
		 String  valor  = CODIGO_VERIFICACION_OK+"/"+""; 		
		 boolean flag = true;
		 CertCab i=null;
		 List<CertDet> detLista =null;
		 CertificadoSecuencia cert =null;
		 Ejecutora e =null;
		 MaestroDocumento m =null;
		 FuenteFinanc f =null;
		 MaestroDetalle md = null;
		 MaestroClasificador mc =null;
		 Meta me = null;
		 try {
			 i = (CertCab) params.get("certCab");  	     
			 detLista = (List<CertDet>) params.get("listaDet");		
			 
			 /**VALIDACION DE CAMPOS DE CERT_CAB CERTIFICACION NUEVO**/
		     /**datos para validar num_doc sea unico**/
		     cert = new CertificadoSecuencia();			
		     cert.setCodDoc(i.getCodDoc());
		     cert.setNumDoc(i.getNumDoc()); 
			 cert.setAnoEje(i.getAnoEje());		
			 cert.setSecEjec(i.getSecEjec());  
			 	
			 int  cab = certCabDao.verificarSecuencialCab(i);
			 if(cab > 0){			
				 valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_CAB+"/"+ 
			             Constantes.SECUENCIAL_EXISTE_CERT_CAB;
				flag =false;
			 }			
			if(flag){
				 e = new Ejecutora();
				 e.setAnoEje(i.getAnoEje()); 
				 int  anoEje  = maestroDetalleDao.verificarAnoEje(e);				
				 if(anoEje ==0){					
					valor =  Constantes.COD_ANO_EJE_NO_EXISTE_CERT_CAB+"/"+
				             Constantes.ANO_EJE_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	
			}	
			if(flag){
			     e = new Ejecutora();
				 e.setSecEjec(i.getSecEjec()); 
			     int  secEje  = maestroDetalleDao.verificarSecEje(e);				
				 if(secEje==0){					
					 valor = Constantes.COD_SEC_EJEC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.SEC_EJEC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }					
			}
			if(flag){								
				 if(!Constantes.ES_COMP_ANUAL_NO.equalsIgnoreCase(i.getEsComp())){ 					
					 valor = Constantes.COD_ES_COMP_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ES_COMP_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }					
			}					
			if(flag){
				 m = new MaestroDocumento();
				 m.setCodDoc(i.getCodDoc()); 
				 int  codDoc  = maestroDocumentoDao.verificarCodDoc(m); 				
				 if(codDoc==0){					
					valor = Constantes.COD_COD_DOC_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.COD_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}	
			if(flag){				 
				 int  numDoc  = certificadoSecuenciaDao.verificarExiteCertificadoNumDoc(cert);				
				 if(numDoc!=0){					
					valor = Constantes.COD_NUM_DOC_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.NUM_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}	
			if(flag){
				 f = new FuenteFinanc();
				 f.setFuenteFin(i.getFteFin()); 
				 int  fteFin  = fuenteFinancDao.verificarFteFin(f);	
				 if(fteFin==0){					
					 valor = Constantes.COD_FTE_FIN_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.FTE_FIN_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}		
			if(flag){
				 md = new MaestroDetalle();
				 md.setCodDetall(i.getMoneda()); 
				 int  moneda  = maestroDetalleDao.verificarMoneda(md);		
				 if(moneda==0){				
					valor = Constantes.COD_MONEDA_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.MONEDA_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}		
			if(flag){					
				 if(!validarEstadoE(i.getUeEnvio())){			
					valor = Constantes.COD_UE_ENVIO_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.UE_ENVIO_NO_EXISTE_CERT_CAB;
					 flag =false;					
				 }	 
			}			
			if(flag){				
				 if(!ESTADO_ENVIO_N.equals(i.getUeEstado())){  					
					 valor =  Constantes.COD_UE_ESTADO_NO_EXISTE_CERT_CAB+"/"+
					          Constantes.UE_ESTADO_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}	
			//falta estado_reg
			 
			 /**VALIDACION DE CAMPOS DE CERT_DET CERTIFICACION NUEVO**/
			for(CertDet d :detLista){
				 if(flag){
					 int  det  = certDetDao.verificarSecuencialDet(d);
					 if(det >0 && flag){						
						valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_DET+"/"+
						        Constantes.SECUENCIAL_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){				
					 if(!d.getSecuencial().equals(i.getSecuencial())){					
						 valor = Constantes.COD_SECUENCIAL_NO_COINCIDE_CERT_DET+"/"+
							     Constantes.SECUENCIAL_NO_COINCIDE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){
					 mc = new MaestroClasificador();
					 mc.setIdClasifi(d.getIdClasifi()); 
					 int  idClasifi  = maestroClasificadorDao.verificarIdClasifi(mc);		
					 if(idClasifi==0){								
						 valor = Constantes.COD_ID_CLASIFI_NO_EXISTE_CERT_DET+"/"+
							     Constantes.ID_CLASIFI_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
				} 
				if(flag){
					 me = new Meta();
					 me.setAnoEje(i.getAnoEje()); 
					 me.setSecEjec(i.getSecEjec());
					 me.setSecFunc(d.getSecFunc()); 
					 int  secFunc  = metaDao.verificarExiteSecFunc(me);		
					 if(secFunc==0){								
						 valor = Constantes.COD_SEC_FUNC_NO_EXISTE_CERT_DET+"/"+
							     Constantes.SEC_FUNC_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
			   } 
			   if(flag){
					 mc = new MaestroClasificador();
					 mc.setAnoEje(i.getAnoEje());
					 mc.setClasificad(d.getClasifniv1()+d.getClasifniv2()+
							 " "+d.getClasifniv3()+" "+d.getClasifniv4()+
							 " "+d.getClasifniv5()+" "+d.getClasifniv6());
					 int  nivClasificad  = maestroClasificadorDao.verificarNivClasifi(mc);		
					 if(nivClasificad==0){							
						 valor = Constantes.COD_CLASIFNIVELES_NO_EXISTE_CERT_DET+"/"+
							     Constantes.CLASIFNIVELES_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
				} 		
			}//fin del for		
		} catch (Exception ex) {		
			logger.info("Error al validar certificacion nuevo"+ex); 			
			valor = CODIGO_VERIFICACION_ERROR+"/"+"";
		}finally{			
			if(i!=null){
				 i = null;	
			}
			if(detLista!=null){
				detLista =null;
			}
			if(cert!=null){
				cert =null;
			}
			if(e!=null){
			   e=null;
			}
			if(m !=null){
				m =null;
			}			
			if(md!=null){
				md =null;
			}
			if(f !=null){
				f=null;
			}		
			if(mc !=null){
				mc=null;
			}
			if(me !=null){
				me=null;
			}			
		}
		 return valor;
	}
	
	/**validar Certificacion ampliacion*/
	
	@Override
	@SuppressWarnings("unchecked")
	public String validarCertificacionAmpl(Map<String, Object> params) throws Exception {
		 String  valor  = CODIGO_VERIFICACION_OK+"/"+""; 
		 boolean flag = true;
		 CertCab i=null;
		 List<CertDet> detLista =null;
		 CertificadoSecuencia cert =null;
		 Ejecutora e =null;
		 MaestroDocumento m =null;
		 FuenteFinanc f =null;
		 MaestroDetalle md = null;
		 MaestroClasificador mc =null;
		 Meta me = null;
		 try {
			 i = (CertCab) params.get("certCab");  		    
			 detLista = (List<CertDet>) params.get("listaDet");	
		     
			 /**VALIDACION DE CAMPOS DE CERT_CAB  CERTIFICACION AMPLIACION**/
			 cert = new CertificadoSecuencia();			
			 cert.setCorrelativ(i.getIntfCor());
			 cert.setSecuencia(i.getIntfSec());
			 cert.setAnoEje(i.getAnoEje());		
			 cert.setCertificad(i.getIntfCer()); 
			 cert.setCodDoc(i.getCodDoc());
			 cert.setNumDoc(i.getNumDoc());
			 cert.setSecEjec(i.getSecEjec()); 
			 if(flag){				
				 int numCertif = certificadoSecuenciaDao.verificarExiteCertificado(cert);				
				 if(numCertif==0){ 
					 valor = Constantes.COD_EXISTE_CERTIFICADO_PROCESOS+"/"+
					         Constantes.EXISTE_CERTIFICADO_PROCESOS;
					 flag =false;
				 }	 
			}			 
			if(flag){
				 int  cab = certCabDao.verificarSecuencialCab(i);
				 if(cab >0){
					valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_CAB+"/"+
							Constantes.SECUENCIAL_EXISTE_CERT_CAB;
					flag =false;
				 }		
			}
			if(flag){
				 e = new Ejecutora();
				 e.setAnoEje(i.getAnoEje()); 
				 int  anoEje  = maestroDetalleDao.verificarAnoEje(e);				
				 if(anoEje ==0){
					 valor = Constantes.COD_ANO_EJE_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ANO_EJE_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 e = new Ejecutora();
				 e.setSecEjec(i.getSecEjec()); 
			     int  secEje  = maestroDetalleDao.verificarSecEje(e);				
				 if(secEje==0){
					 valor = Constantes.COD_SEC_EJEC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.SEC_EJEC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){								
				 if(!Constantes.ES_COMP_ANUAL_NO.equalsIgnoreCase(i.getEsComp())){ 					
					 valor = Constantes.COD_ES_COMP_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ES_COMP_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }					
			}		
			if(flag){
				 m = new MaestroDocumento();
				 m.setCodDoc(i.getCodDoc()); 
				 int  codDoc  = maestroDocumentoDao.verificarCodDoc(m); 				
				 if(codDoc==0){
					 valor = Constantes.COD_COD_DOC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.COD_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){				 
				 int  numDoc  = certificadoSecuenciaDao.verificarExiteCertificadoNumDoc(cert);				
				 if(numDoc!=0){					
					valor = Constantes.COD_NUM_DOC_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.NUM_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				cert.setCorrelativ("0001");
				 logger.info("Ingresando a buscar fecha de doc en certificado secuencial"); 
				 List<CertificadoSecuencia>  certifi  = certificadoSecuenciaDao.bucarFechaDocCert(cert);
				 logger.info("Fecha de doc en certificado secuencial es: "+certifi.get(0).getFechaDoc());
				 logger.info("Fecha de doc ingresado es: "+i.getFecDoc());
				 if(i.getFecDoc().before(certifi.get(0).getFechaDoc())){
					logger.info("La fecha ingresada es menor a la fecha de certificado"); 
					valor = Constantes.COD_FEC_DOC_MAYOR_CERT_CAB+"/"+
					        Constantes.FEC_DOC_MAYOR_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 f = new FuenteFinanc();
				 f.setFuenteFin(i.getFteFin()); 
				 int  fteFin  = fuenteFinancDao.verificarFteFin(f);	
				 if(fteFin==0){					
					 valor = Constantes.COD_FTE_FIN_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.FTE_FIN_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}		
			if(flag){
				 md = new MaestroDetalle();
				 md.setCodDetall(i.getMoneda()); 
				 int  moneda  = maestroDetalleDao.verificarMoneda(md);		
				 if(moneda==0){				
					valor = Constantes.COD_MONEDA_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.MONEDA_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}	
			if(flag){					
				 if(!validarEstadoE(i.getUeEnvio())){ 					
					 valor = Constantes.COD_UE_ENVIO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ENVIO_NO_EXISTE_CERT_CAB;
					 flag =false;					
				 }	 
			}			
			if(flag){				
				 if(!validarEstadoES(i.getUeEstado())){  
					 valor = Constantes.COD_UE_ESTADO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ESTADO_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			
			 /**VALIDACION DE CAMPOS DE CERT_DET  CERTIFICACION AMPLIACION**/
			for(CertDet d :detLista){
				if(flag){
					 int  det  = certDetDao.verificarSecuencialDet(d);
					 if(det >0 && flag){
						 valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){				
					 if(!i.getSecuencial().equals(d.getSecuencial())){
						 valor = Constantes.COD_SECUENCIAL_NO_COINCIDE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_NO_COINCIDE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){
					 mc = new MaestroClasificador();
					 mc.setIdClasifi(d.getIdClasifi()); 
					 int  idClasifi  = maestroClasificadorDao.verificarIdClasifi(mc);		
					 if(idClasifi==0){
						 valor = Constantes.COD_ID_CLASIFI_NO_EXISTE_CERT_DET+"/"+
						         Constantes.ID_CLASIFI_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				} 
				if(flag){
					 me = new Meta();
					 me.setAnoEje(i.getAnoEje()); 
					 me.setSecEjec(i.getSecEjec());
					 me.setSecFunc(d.getSecFunc()); 
					 int  secFunc  = metaDao.verificarExiteSecFunc(me);		
					 if(secFunc==0){								
						 valor = Constantes.COD_SEC_FUNC_NO_EXISTE_CERT_DET+"/"+
							     Constantes.SEC_FUNC_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
			   } 
			   if(flag){
					 mc = new MaestroClasificador();
					 mc.setAnoEje(i.getAnoEje());
					 mc.setClasificad(d.getClasifniv1()+d.getClasifniv2()+
							 " "+d.getClasifniv3()+" "+d.getClasifniv4()+
							 " "+d.getClasifniv5()+" "+d.getClasifniv6());
					 int  nivClasificad  = maestroClasificadorDao.verificarNivClasifi(mc);		
					 if(nivClasificad==0){
						 valor = Constantes.COD_CLASIFNIVELES_NO_EXISTE_CERT_DET+"/"+
						         Constantes.CLASIFNIVELES_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
				}			
			}//fin del for			 
		} catch (Exception ex) {			
			logger.info("Error validar certificacion ampliacion "+ex); 
			valor = CODIGO_VERIFICACION_ERROR+"/"+"";
		}finally{
			if(i!=null){
				 i = null;	
			}
			if(detLista!=null){
				detLista =null;
			}
			if(cert!=null){
				cert =null;
			}
			if(e!=null){
			   e=null;
			}
			if(m !=null){
				m =null;
			}			
			if(md!=null){
				md =null;
			}
			if(f !=null){
				f=null;
			}		
			if(mc !=null){
				mc=null;
			}
			if(me !=null){
				me=null;
			}			
		}
		 return valor;
	}	
	
   /**validar certificacion Rebaja*/	
	@Override
	@SuppressWarnings("unchecked")
	public String validarCertificacionRebaja(Map<String, Object> params) throws Exception {
		 String  valor  = CODIGO_VERIFICACION_OK+"/"+"";
		 boolean flag = true;
		 CertCab i=null;
		 List<CertDet> detLista =null;
		 CertificadoSecuencia cert =null;
		 Ejecutora e =null;
		 MaestroDocumento m =null;
		 FuenteFinanc f =null;
		 MaestroDetalle md = null;
		 MaestroClasificador mc =null;
		 Meta me = null;
		 try {
			 i = (CertCab) params.get("certCab");   	     
			 detLista = (List<CertDet>) params.get("listaDet");
			 
		     //double montoTotal = (Double)params.get("montoTotal")*(-1);
		     double montoMnTotal = (Double)params.get("montoMnTotal")*(-1);
		     
			 /**VALIDACION DE CAMPOS DE CERT_CAB CERTIFICACION REBAJA**/
		     cert = new CertificadoSecuencia();			 
		     cert.setCorrelativ(i.getIntfCor());
			 cert.setSecuencia(i.getIntfSec());
			 cert.setAnoEje(i.getAnoEje());		
			 cert.setCertificad(i.getIntfCer()); 
			 cert.setCodDoc(i.getCodDoc());
			 cert.setNumDoc(i.getNumDoc());
			 cert.setSecEjec(i.getSecEjec());
			 
			 CertificadoFase certF = new CertificadoFase();
			 certF.setSecuencia(i.getIntfSec());
			 certF.setAnoEje(i.getAnoEje());		
			 certF.setCertificad(i.getIntfCer());			
			 certF.setSecEjec(i.getSecEjec());
			 
			 if(flag){				
				 int numCertif = certificadoFaseDao.verificarExiteCertificado(certF);					
				 if(numCertif==0){ 
					 valor = Constantes.COD_EXISTE_CERTIFICADO_PROCESOS+"/"+
					         Constantes.EXISTE_CERTIFICADO_PROCESOS;
					 flag =false;
				 }	 
			}			
			if(flag){
				 int  cab = certCabDao.verificarSecuencialCab(i);
				 if(cab >0){
					valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_CAB+"/"+
					        Constantes.SECUENCIAL_EXISTE_CERT_CAB;
					flag =false;
				 }		
			}
			if(flag){
				 e = new Ejecutora();
				 e.setAnoEje(i.getAnoEje()); 
				 int  anoEje  = maestroDetalleDao.verificarAnoEje(e);				
				 if(anoEje ==0){
					 valor = Constantes.COD_ANO_EJE_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ANO_EJE_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 e = new Ejecutora();
				 e.setSecEjec(i.getSecEjec()); 
			     int  secEje  = maestroDetalleDao.verificarSecEje(e);				
				 if(secEje==0){
					 valor = Constantes.COD_SEC_EJEC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.SEC_EJEC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}			
			if(flag){								
				 if(!Constantes.ES_COMP_ANUAL_NO.equalsIgnoreCase(i.getEsComp())){ 					
					 valor = Constantes.COD_ES_COMP_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ES_COMP_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }					
			}		
			if(flag){
				 m = new MaestroDocumento();
				 m.setCodDoc(i.getCodDoc()); 
				 int  codDoc  = maestroDocumentoDao.verificarCodDoc(m); 				
				 if(codDoc==0){
					 valor = Constantes.COD_COD_DOC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.COD_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){				 
				 int  numDoc  = certificadoSecuenciaDao.verificarExiteCertificadoNumDoc(cert);				
				 if(numDoc!=0){					
					valor = Constantes.COD_NUM_DOC_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.NUM_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 cert.setCorrelativ("0001");
				 logger.info("Ingresando a buscar fecha de doc en certificado secuencial"); 
				 List<CertificadoSecuencia>  certifi  = certificadoSecuenciaDao.bucarFechaDocCert(cert);
				 logger.info("Fecha de doc en certificado secuencial es: "+certifi.get(0).getFechaDoc());
				 logger.info("Fecha de doc ingresado es: "+i.getFecDoc());
				 if(i.getFecDoc().before(certifi.get(0).getFechaDoc())){
					logger.info("La fecha ingresada es menor a la fecha de certificado"); 
					valor = Constantes.COD_FEC_DOC_MAYOR_CERT_CAB+"/"+
					        Constantes.FEC_DOC_MAYOR_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 f = new FuenteFinanc();
				 f.setFuenteFin(i.getFteFin()); 
				 int  fteFin  = fuenteFinancDao.verificarFteFin(f);	
				 if(fteFin==0){					
					 valor = Constantes.COD_FTE_FIN_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.FTE_FIN_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}		
			if(flag){
				 md = new MaestroDetalle();
				 md.setCodDetall(i.getMoneda()); 
				 int  moneda  = maestroDetalleDao.verificarMoneda(md);		
				 if(moneda==0){				
					valor = Constantes.COD_MONEDA_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.MONEDA_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){					
				 if(!validarEstadoE(i.getUeEnvio())){ 					
					 valor = Constantes.COD_UE_ENVIO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ENVIO_NO_EXISTE_CERT_CAB;
					 flag =false;					
				 }	 
			}			
			if(flag){				
				 if(!validarEstadoES(i.getUeEstado())){  
					 valor = Constantes.COD_UE_ESTADO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ESTADO_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			
			 /**VALIDACION DE CAMPOS DE CERT_DET CERTIFICACION REBAJA**/
			for(CertDet d :detLista){
				if(flag){
					 int  det  = certDetDao.verificarSecuencialDet(d);
					 if(det >0 && flag){
						 valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){				
					 if(!i.getSecuencial().equals(d.getSecuencial())){
						 valor = Constantes.COD_SECUENCIAL_NO_COINCIDE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_NO_COINCIDE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){
					 mc = new MaestroClasificador();
					 mc.setIdClasifi(d.getIdClasifi()); 
					 int  idClasifi  = maestroClasificadorDao.verificarIdClasifi(mc);		
					 if(idClasifi==0){
						 valor = Constantes.COD_ID_CLASIFI_NO_EXISTE_CERT_DET+"/"+
						         Constantes.ID_CLASIFI_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				}
				if(flag){
					 me = new Meta();
					 me.setAnoEje(i.getAnoEje()); 
					 me.setSecEjec(i.getSecEjec());
					 me.setSecFunc(d.getSecFunc()); 
					 int  secFunc  = metaDao.verificarExiteSecFunc(me);		
					 if(secFunc==0){								
						 valor = Constantes.COD_SEC_FUNC_NO_EXISTE_CERT_DET+"/"+
							     Constantes.SEC_FUNC_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
			   } 
			   if(flag){
					 mc = new MaestroClasificador();
					 mc.setAnoEje(i.getAnoEje());
					 mc.setClasificad(d.getClasifniv1()+d.getClasifniv2()+
							 " "+d.getClasifniv3()+" "+d.getClasifniv4()+
							 " "+d.getClasifniv5()+" "+d.getClasifniv6());
					 int  nivClasificad  = maestroClasificadorDao.verificarNivClasifi(mc);		
					 if(nivClasificad==0){
						 valor = Constantes.COD_CLASIFNIVELES_NO_EXISTE_CERT_DET+"/"+
						         Constantes.CLASIFNIVELES_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
				}			   
			}//fin del for	
			/*if(flag){				
				List<CertificadoSecuencia> certMonto = certificadoSecuenciaDao.bucarMontoTotalCert(cert);
				logger.info("Monto Total certificacion por rebaja :  "+montoTotal); 
				logger.info("Monto Total certificacion por rebaja cerificado:  "+certMonto.get(0).getMonto()); 
				if(certMonto.get(0).getMonto()<=montoTotal){ 
					valor = Constantes.COD_MONTO_DET_MAYOR_MONTO_CERT+"/"+
					        Constantes.MONTO_DET_MAYOR_MONTO_CERT;
					flag =false;				
				}	 
			} */			
			if(flag){				
				List<CertificadoFase> certMontoMn =certificadoFaseDao.bucarMontoMnTotalCert(certF);
				logger.info("Monto Mn Total certificacion por rebaja :  "+montoMnTotal); 
				logger.info("Monto MN Total certificacion por rebaja certificado:  "+certMontoMn.get(0).getSaldoNaci());
				if(certMontoMn.get(0).getSaldoNaci()<=montoMnTotal){ 
					valor = Constantes.COD_MONTOMN_DET_MAYOR_MONTO_CERT_REBAJA+"/"+
					        Constantes.MONTOMN_DET_MAYOR_MONTO_CERT_REBAJA;
					flag =false;				
				}	 
		   } 	
		} catch (Exception ex) {				
			logger.info("Error validar certificacion rebaja "+ex); 
			valor = CODIGO_VERIFICACION_ERROR+"/"+"";
		}finally{
			if(i!=null){
				 i = null;	
			}
			if(detLista!=null){
				detLista =null;
			}
			if(cert!=null){
				cert =null;
			}
			if(e!=null){
			   e=null;
			}
			if(m !=null){
				m =null;
			}			
			if(md!=null){
				md =null;
			}
			if(f !=null){
				f=null;
			}		
			if(mc !=null){
				mc=null;
			}
			if(me !=null){
				me=null;
			}			
		}
		 return valor;
	}
	
	 /**validar certificacion Anulacion*/	
    @Override
    @SuppressWarnings("unchecked")
	public String validarCertificacionAnulacion(Map<String, Object> params) throws Exception {
		 String  valor  = CODIGO_VERIFICACION_OK+"/"+""; 
		 boolean flag = true;
		 CertCab i=null;
		 List<CertDet> detLista =null;
		 CertificadoSecuencia cert =null;
		 Ejecutora e =null;
		 MaestroDocumento m =null;
		 FuenteFinanc f =null;
		 MaestroDetalle md = null;
		 MaestroClasificador mc =null;
		 Meta me = null;
		 CertificadoFase certF =null;
		 try {
			 i = (CertCab) params.get("certCab");   		    
			 detLista = (List<CertDet>) params.get("listaDet");			 
		     //double montoTotal = (Double)params.get("montoTotal")*(-1);
		     double montoMnTotal = (Double)params.get("montoMnTotal")*(-1);
		     
			 /**VALIDACION DE CAMPOS DE CERT_CAB CERTIFICACION ANULACION **/
		     cert = new CertificadoSecuencia();		   	
			 cert.setCorrelativ(i.getIntfCor());
			 cert.setSecuencia(i.getIntfSec());
			 cert.setAnoEje(i.getAnoEje());		
			 cert.setCertificad(i.getIntfCer());
			 cert.setCodDoc(i.getCodDoc());
			 cert.setNumDoc(i.getNumDoc());
			 cert.setSecEjec(i.getSecEjec()); 
			 
			 certF = new CertificadoFase();
			 certF.setSecuencia(i.getIntfSec());
			 certF.setAnoEje(i.getAnoEje());		
			 certF.setCertificad(i.getIntfCer());			
			 certF.setSecEjec(i.getSecEjec()); 
			 
			 
			 if(flag){				
				 int numCertif = certificadoSecuenciaDao.verificarExiteCertificado(cert);						
				 if(numCertif==0){ 
					 valor = Constantes.COD_EXISTE_CERTIFICADO_PROCESOS+"/"+
					         Constantes.EXISTE_CERTIFICADO_PROCESOS;
					 flag =false;
				 }	 
			 }			
			if(flag){
				 int  cab = certCabDao.verificarSecuencialCab(i);
				 if(cab >0){
					valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_CAB+"/"+
					        Constantes.SECUENCIAL_EXISTE_CERT_CAB;
					flag =false;
				 }		
			}
			if(flag){
				 e = new Ejecutora();
				 e.setAnoEje(i.getAnoEje()); 
				 int  anoEje  = maestroDetalleDao.verificarAnoEje(e);				
				 if(anoEje ==0){
					 valor = Constantes.COD_ANO_EJE_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ANO_EJE_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 e = new Ejecutora();
				 e.setSecEjec(i.getSecEjec()); 
			     int  secEje  = maestroDetalleDao.verificarSecEje(e);				
				 if(secEje==0){
					 valor = Constantes.COD_SEC_EJEC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.SEC_EJEC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}			
			if(flag){								
				 if(!Constantes.ES_COMP_ANUAL_NO.equalsIgnoreCase(i.getEsComp())){ 					
					 valor = Constantes.COD_ES_COMP_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ES_COMP_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }					
			}		
			if(flag){
				 m = new MaestroDocumento();
				 m.setCodDoc(i.getCodDoc()); 
				 int  codDoc  = maestroDocumentoDao.verificarCodDoc(m); 				
				 if(codDoc==0){
					 valor = Constantes.COD_COD_DOC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.COD_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){				 
				 int  numDoc  = certificadoSecuenciaDao.verificarExiteCertificadoNumDoc(cert);				
				 if(numDoc!=0){					
					valor = Constantes.COD_NUM_DOC_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.NUM_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				cert.setCorrelativ("0001");
				 logger.info("Ingresando a buscar fecha de doc en certificado secuencial"); 
				 List<CertificadoSecuencia>  certifi  = certificadoSecuenciaDao.bucarFechaDocCert(cert);
				 logger.info("Fecha de doc en certificado secuencial es: "+certifi.get(0).getFechaDoc());
				 logger.info("Fecha de doc ingresado es: "+i.getFecDoc());
				 if(i.getFecDoc().before(certifi.get(0).getFechaDoc())){
					logger.info("La fecha ingresada es menor a la fecha de certificado"); 
					valor = Constantes.COD_FEC_DOC_MAYOR_CERT_CAB+"/"+
					        Constantes.FEC_DOC_MAYOR_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 f = new FuenteFinanc();
				 f.setFuenteFin(i.getFteFin()); 
				 int  fteFin  = fuenteFinancDao.verificarFteFin(f);	
				 if(fteFin==0){					
					 valor = Constantes.COD_FTE_FIN_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.FTE_FIN_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}		
			if(flag){
				 md = new MaestroDetalle();
				 md.setCodDetall(i.getMoneda()); 
				 int  moneda  = maestroDetalleDao.verificarMoneda(md);		
				 if(moneda==0){				
					valor = Constantes.COD_MONEDA_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.MONEDA_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){					
				 if(!validarEstadoE(i.getUeEnvio())){ 					
					 valor = Constantes.COD_UE_ENVIO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ENVIO_NO_EXISTE_CERT_CAB;
					 flag =false;					
				 }	 
			}			
			if(flag){				
				 if(!validarEstadoES(i.getUeEstado())){  
					 valor = Constantes.COD_UE_ESTADO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ESTADO_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			
			/**VALIDACION DE CAMPOS DE CERT_DET CERTIFICACION ANULACION **/
			for(CertDet d :detLista){
				 if(flag){
					 int  det  = certDetDao.verificarSecuencialDet(d);
					 if(det >0 && flag){
						 valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){				
					 if(!i.getSecuencial().equals(d.getSecuencial())){
						 valor = Constantes.COD_SECUENCIAL_NO_COINCIDE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_NO_COINCIDE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){
					 mc = new MaestroClasificador();
					 mc.setIdClasifi(d.getIdClasifi()); 
					 int  idClasifi  = maestroClasificadorDao.verificarIdClasifi(mc);		
					 if(idClasifi==0){
						 valor = Constantes.COD_ID_CLASIFI_NO_EXISTE_CERT_DET+"/"+
						         Constantes.ID_CLASIFI_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				} 
			    if(flag){
					 me = new Meta();
					 me.setAnoEje(i.getAnoEje()); 
					 me.setSecEjec(i.getSecEjec());
					 me.setSecFunc(d.getSecFunc()); 
					 int  secFunc  = metaDao.verificarExiteSecFunc(me);		
					 if(secFunc==0){								
						 valor = Constantes.COD_SEC_FUNC_NO_EXISTE_CERT_DET+"/"+
							     Constantes.SEC_FUNC_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
			   } 
			   if(flag){
					 mc = new MaestroClasificador();
					 mc.setAnoEje(i.getAnoEje());
					 mc.setClasificad(d.getClasifniv1()+d.getClasifniv2()+
							 " "+d.getClasifniv3()+" "+d.getClasifniv4()+
							 " "+d.getClasifniv5()+" "+d.getClasifniv6());
					 int  nivClasificad  = maestroClasificadorDao.verificarNivClasifi(mc);		
					 if(nivClasificad==0){
						 valor = Constantes.COD_CLASIFNIVELES_NO_EXISTE_CERT_DET+"/"+
						         Constantes.CLASIFNIVELES_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
				}			   
			}//fin del for				
			/*if(flag){				
				List<CertificadoSecuencia> certMonto = certificadoSecuenciaDao.bucarMontoTotalCert(cert);
				logger.info("Monto Total certificacion por anulacion :  "+montoTotal); 
				logger.info("Monto Total certificacion por anulacion cerificado:  "+certMonto.get(0).getMonto()); 
				if(certMonto.get(0).getMonto()!=montoTotal){ 
					valor = Constantes.COD_MONTO_DET_MAYOR_MONTO_CERT+"/"+
					        Constantes.MONTO_DET_MAYOR_MONTO_CERT;
					flag =false;				
				}	 
			} */
			if(flag){				
				List<CertificadoFase> certMontoMn =certificadoFaseDao.bucarMontoMnTotalCert(certF);
				logger.info("Monto Mn Total certificacion por anulacion :  "+montoMnTotal); 
				logger.info("Monto MN Total certificacion por anulacion certificado:  "+certMontoMn.get(0).getSaldoNaci());
				if(certMontoMn.get(0).getSaldoNaci()!=montoMnTotal){ 
					valor = Constantes.COD_MONTOMN_DET_MAYOR_MONTO_CERT+"/"+
					        Constantes.MONTOMN_DET_MAYOR_MONTO_CERT;
					flag =false;				
				}	 
			} 	
		} catch (Exception ex) {		
			logger.info("Error validar certificacion por anulacion "+ex); 
			valor = CODIGO_VERIFICACION_ERROR+"/"+"";
		}finally{
			if(i!=null){
				 i = null;	
			}
			if(detLista!=null){
				detLista =null;
			}
			if(cert!=null){
				cert =null;
			}
			if(e!=null){
			   e=null;
			}
			if(m !=null){
				m =null;
			}			
			if(md!=null){
				md =null;
			}
			if(f !=null){
				f=null;
			}		
			if(mc !=null){
				mc=null;
			}
			if(me !=null){
				me=null;
			}	
			if(certF !=null){
				certF=null;
			}	
		}
		 return valor;
	}
	
	
	private boolean validarEstadoE(String cadena){
		boolean estado = false;
		if(ESTADO_ENVIO_P.equals(cadena)){
			estado= true;
		}else if(ESTADO_ENVIO_N.equals(cadena)){
		  estado = true;	
		}
		return estado;
	}
	
	private boolean validarEstadoES(String cadena){
		boolean estado = false;
		if(ESTADO_ENVIO_P.equals(cadena)){
			estado= true;
		}else if(ESTADO_ENVIO_N.equals(cadena)){
		    estado = true;	
		}else if(ESTADO_ENVIO_R.equals(cadena)){
		   estado = true;
		}
		return estado;
	}
	
	/*******VALIDACION PARA COMPROMISO ANUAL NUEVO******/	
	@Override	
	@SuppressWarnings("unchecked")
	public String validarCompromisoAnualNuevo(Map<String, Object> params) throws Exception {
		 String  valor  = CODIGO_VERIFICACION_OK+"/"+"";
		 boolean flag = true;
		 CertCab i=null;
		 List<CertDet> detLista =null;
		 CertificadoSecuencia cert =null;
		 Ejecutora e =null;
		 MaestroDocumento m =null;
		 FuenteFinanc f =null;
		 MaestroDetalle md = null;
		 MaestroClasificador mc =null;
		 Meta me = null;
		 CertificadoFase certF =null;
		 try {
			 i = (CertCab) params.get("certCab");   		    
			 detLista = (List<CertDet>) params.get("listaDet");	
			 
		     double montoMnTotal = (Double)params.get("montoMnTotal");
			 /**VALIDACION DE CAMPOS DE CERT_CAB COMPROMISO ANUAL**/			 
			 /**VALIDACION PARA VERIFICAR SI EXITE LA CERTIFICACION CASO 
			  * CONTRARIO NO SE PUEDE HACER UN COMPROMISO ANUAL**/
		     cert = new CertificadoSecuencia();			
			 cert.setCorrelativ(i.getIntfCor());
			 cert.setSecuencia(i.getIntfSec());
			 cert.setAnoEje(i.getAnoEje());		
			 cert.setCertificad(i.getIntfCer()); 
			 cert.setCodDoc(i.getCodDoc());
			 cert.setNumDoc(i.getNumDoc());
			 cert.setSecEjec(i.getSecEjec()); 
			 
			 certF = new CertificadoFase();
			 certF.setSecuencia(i.getIntfSec());
			 certF.setAnoEje(i.getAnoEje());		
			 certF.setCertificad(i.getIntfCer());			
			 certF.setSecEjec(i.getSecEjec());
			 
			 
			 if(flag){				
				 int numCertif = certificadoSecuenciaDao.verificarExiteCertificado(cert);					
				 if(numCertif==0){ 
					 valor = Constantes.COD_EXISTE_CERTIFICADO+"/"+
					         Constantes.EXISTE_CERTIFICADO;
					 flag =false;
				 }	 
			} 
			if(flag){
				 int  cab = certCabDao.verificarSecuencialCab(i);
				 if(cab>0){ 
					valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_CAB+"/"+
					        Constantes.SECUENCIAL_EXISTE_CERT_CAB;
					flag =false;
				 }		 
			}			 	
			if(flag){
				 e = new Ejecutora();
				 e.setAnoEje(i.getAnoEje()); 
				 int  anoEje  = maestroDetalleDao.verificarAnoEje(e);				
				 if(anoEje ==0){
					 valor = Constantes.COD_ANO_EJE_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ANO_EJE_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	
			}	
			if(flag){			
				 e = new Ejecutora();
				 e.setSecEjec(i.getSecEjec()); 
				 int  secEje  = maestroDetalleDao.verificarSecEje(e);				
				 if(secEje==0){
					 valor = Constantes.COD_SEC_EJEC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.SEC_EJEC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){								
				 if(!Constantes.ES_COMP_ANUAL_SI.equalsIgnoreCase(i.getEsComp())){ 					
					 valor = Constantes.COD_ES_COMP_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ES_COMP_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }					
			}
			if(flag){
				 md = new MaestroDetalle();
				 md.setCodDetall(i.getTipoOpe()); 
				 int  tipoOpe  = maestroDetalleDao.verificarTipoOpe(md);			
				 if(tipoOpe==0){					
					 valor = Constantes.COD_TIPO_OPE_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.TIPO_OPE_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 m = new MaestroDocumento();
				 m.setCodDoc(i.getCodDoc()); 
				 int  codDoc  = maestroDocumentoDao.verificarCodDoc(m); 				
				 if(codDoc==0){
					 valor = Constantes.COD_COD_DOC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.COD_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }			
			}
			if(flag){				 
				 int  numDoc  = certificadoSecuenciaDao.verificarExiteCertificadoNumDoc(cert);				
				 if(numDoc!=0){					
					valor = Constantes.COD_NUM_DOC_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.NUM_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 cert.setCorrelativ("0001");
				 logger.info("Ingresando a buscar fecha de doc en certificado secuencial"); 
				 List<CertificadoSecuencia>  certifi  = certificadoSecuenciaDao.bucarFechaDocCert(cert);
				 logger.info("Fecha de doc en certificado secuencial es: "+certifi.get(0).getFechaDoc());
				 logger.info("Fecha de doc ingresado es: "+i.getFecDoc());
				 if(i.getFecDoc().before(certifi.get(0).getFechaDoc())){
					logger.info("La fecha ingresada es menor a la fecha de certificado"); 
					valor = Constantes.COD_FEC_DOC_MAYOR_CERT_CAB+"/"+
					        Constantes.FEC_DOC_MAYOR_CERT_CAB;
					 flag =false;
				 }	 
			}
			
			if(flag){
				 f = new FuenteFinanc();
				 f.setFuenteFin(i.getFteFin()); 
				 int  fteFin  = fuenteFinancDao.verificarFteFin(f);	
				 if(fteFin==0){
					 valor = Constantes.COD_FTE_FIN_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.FTE_FIN_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}				
			if(flag){
				 md = new MaestroDetalle();
				 md.setCodDetall(i.getMoneda()); 
				 int  moneda  = maestroDetalleDao.verificarMoneda(md);		
				 if(moneda==0){
					 valor = Constantes.COD_MONEDA_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.MONEDA_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}			
			if(flag){					
				 if(!validarEstadoE(i.getUeEnvio())){ 					
					 valor = Constantes.COD_UE_ENVIO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ENVIO_NO_EXISTE_CERT_CAB;
					 flag =false;					
				 }	 
			}			
			if(flag){				
				 if(!validarEstadoES(i.getUeEstado())){  
					 valor = Constantes.COD_UE_ESTADO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ESTADO_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}				
			//falta estado_reg
			 
			 /**VALIDACION DE CAMPOS DE CERT_DET COMPROMISO ANUAL NUEVO**/
			for(CertDet d :detLista){
				 if(flag){
					 int  det  = certDetDao.verificarSecuencialDet(d);
					 if(det >0 && flag){
						 valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){				
					 if(!i.getSecuencial().equals(d.getSecuencial())){
						 valor = Constantes.COD_SECUENCIAL_NO_COINCIDE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_NO_COINCIDE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){
					 mc = new MaestroClasificador();
					 mc.setIdClasifi(d.getIdClasifi()); 
					 int  idClasifi  = maestroClasificadorDao.verificarIdClasifi(mc);		
					 if(idClasifi==0){
						 valor = Constantes.COD_ID_CLASIFI_NO_EXISTE_CERT_DET+"/"+
						         Constantes.ID_CLASIFI_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }				
				}
				if(flag){
					 me = new Meta();
					 me.setAnoEje(i.getAnoEje()); 
					 me.setSecEjec(i.getSecEjec());
					 me.setSecFunc(d.getSecFunc()); 
					 int  secFunc  = metaDao.verificarExiteSecFunc(me);		
					 if(secFunc==0){								
						 valor = Constantes.COD_SEC_FUNC_NO_EXISTE_CERT_DET+"/"+
							     Constantes.SEC_FUNC_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
			   } 
			   if(flag){
					 mc = new MaestroClasificador();
					 mc.setAnoEje(i.getAnoEje());
					 mc.setClasificad(d.getClasifniv1()+d.getClasifniv2()+
							 " "+d.getClasifniv3()+" "+d.getClasifniv4()+
							 " "+d.getClasifniv5()+" "+d.getClasifniv6());
					 int  nivClasificad  = maestroClasificadorDao.verificarNivClasifi(mc);		
					 if(nivClasificad==0){
						 valor = Constantes.COD_CLASIFNIVELES_NO_EXISTE_CERT_DET+"/"+
						         Constantes.CLASIFNIVELES_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
				}			    
			}//fin del for
			if(flag){				
				List<CertificadoFase> certMontoMn =certificadoFaseDao.bucarMontoMnTotalCert(certF);
				logger.info("Monto Mn Total para nuevo compromiso anual :  "+montoMnTotal); 
				logger.info("Monto MN Total  para nuevo compromiso anual bd:  "+certMontoMn.get(0).getSaldoNaci());
				if(certMontoMn.get(0).getSaldoNaci()<montoMnTotal){ 
					valor = Constantes.COD_MONTOMN_DET_MAYOR_MONTO_COMP_ANUAL_NUEVO+"/"+
					        Constantes.MONTOMN_DET_MAYOR_MONTO_COMP_ANUAL_NUEVO;
					flag =false;				
				}	 
		   } 	
		} catch (Exception ex) {			
			logger.info("Error al verificar compromiso anual "+ex); 
			valor = CODIGO_VERIFICACION_ERROR+"/"+"";
		}finally{
			if(i!=null){
				 i = null;	
			}
			if(detLista!=null){
				detLista =null;
			}
			if(cert!=null){
				cert =null;
			}
			if(e!=null){
			   e=null;
			}
			if(m !=null){
				m =null;
			}			
			if(md!=null){
				md =null;
			}
			if(f !=null){
				f=null;
			}		
			if(mc !=null){
				mc=null;
			}
			if(me !=null){
				me=null;
			}
			if(certF !=null){
				certF=null;
			}
		}
		 return valor;
	}
	
	/**validar compromiso anual  Anulacion*/	
	@Override
	@SuppressWarnings("unchecked")
	public String validarCompromisoAnualAnulacion(Map<String, Object> params) throws Exception {
		 String  valor  = CODIGO_VERIFICACION_OK+"/"+""; 
		 boolean flag = true;
		 CertCab i=null;
		 List<CertDet> detLista =null;
		 CertificadoSecuencia cert =null;
		 Ejecutora e =null;
		 MaestroDocumento m =null;
		 FuenteFinanc f =null;
		 MaestroDetalle md = null;
		 MaestroClasificador mc =null;
		 Meta me = null;
		 CertificadoFase certF =null;
		 try {
			 i = (CertCab) params.get("certCab");   		     
			 detLista = (List<CertDet>) params.get("listaDet");
		     
		     //double montoTotal = (Double)params.get("montoTotal")*(-1);
		     double montoMnTotal = (Double)params.get("montoMnTotal")*(-1);
		     
			 /**VALIDACION DE CAMPOS DE CERT_CAB COMPROMISO ANUAL- ANULACION **/
		     cert = new CertificadoSecuencia();			
			 cert.setCorrelativ(i.getIntfCor());
			 cert.setSecuencia(i.getIntfSec());
			 cert.setAnoEje(i.getAnoEje());		
			 cert.setCertificad(i.getIntfCer()); 
			 cert.setCodDoc(i.getCodDoc());
			 cert.setNumDoc(i.getNumDoc());
			 cert.setSecEjec(i.getSecEjec()); 
			 
			 certF = new CertificadoFase();
			 certF.setSecuencia(i.getIntfSec());
			 certF.setAnoEje(i.getAnoEje());		
			 certF.setCertificad(i.getIntfCer());			
			 certF.setSecEjec(i.getSecEjec()); 
			 
			if(flag){				
				 int numCertif = certificadoSecuenciaDao.verificarExiteCompromisoAnual(cert);	 					
				 if(numCertif==0){ 
					 valor = Constantes.COD_EXISTE_COMPROMISO_ANUAL_PROCESOS+"/"+
					         Constantes.EXISTE_COMPROMISO_ANUAL_PROCESOS;
					 flag =false;
				 }	 
			}			
			if(flag){
				 int  cab = certCabDao.verificarSecuencialCab(i);
				 if(cab >0){
					valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_CAB+"/"+
					        Constantes.SECUENCIAL_EXISTE_INTF_CAB;
					flag =false;
				 }		
			}
			if(flag){
				 e = new Ejecutora();
				 e.setAnoEje(i.getAnoEje()); 
				 int  anoEje  = maestroDetalleDao.verificarAnoEje(e);				
				 if(anoEje ==0){
					 valor = Constantes.COD_ANO_EJE_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ANO_EJE_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 e = new Ejecutora();
				 e.setSecEjec(i.getSecEjec()); 
			     int  secEje  = maestroDetalleDao.verificarSecEje(e);				
				 if(secEje==0){
					 valor = Constantes.COD_SEC_EJEC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.SEC_EJEC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}			
			if(flag){								
				 if(!Constantes.ES_COMP_ANUAL_SI.equalsIgnoreCase(i.getEsComp())){ 					
					 valor = Constantes.COD_ES_COMP_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ES_COMP_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }					
			}	
			if(flag){
				 m = new MaestroDocumento();
				 m.setCodDoc(i.getCodDoc()); 
				 int  codDoc  = maestroDocumentoDao.verificarCodDoc(m); 				
				 if(codDoc==0){
					 valor = Constantes.COD_COD_DOC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.COD_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){				 
				 int  numDoc  = certificadoSecuenciaDao.verificarExiteCertificadoNumDoc(cert);				
				 if(numDoc!=0){					
					valor = Constantes.COD_NUM_DOC_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.NUM_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 logger.info("Ingresando a buscar fecha de doc en certificado secuencial"); 
				 List<CertificadoSecuencia>  certifi  = certificadoSecuenciaDao.bucarFechaDocCert(cert);
				 logger.info("Fecha de doc en certificado secuencial es: "+certifi.get(0).getFechaDoc());
				 logger.info("Fecha de doc ingresado es: "+i.getFecDoc());
				 if(i.getFecDoc().before(certifi.get(0).getFechaDoc())){
					logger.info("La fecha ingresada es menor a la fecha de certificado"); 
					valor = Constantes.COD_FEC_DOC_MAYOR_CERT_CAB+"/"+
					        Constantes.FEC_DOC_MAYOR_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 f = new FuenteFinanc();
				 f.setFuenteFin(i.getFteFin()); 
				 int  fteFin  = fuenteFinancDao.verificarFteFin(f);	
				 if(fteFin==0){
					 valor = Constantes.COD_FTE_FIN_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.FTE_FIN_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}				
			if(flag){
				 md = new MaestroDetalle();
				 md.setCodDetall(i.getMoneda()); 
				 int  moneda  = maestroDetalleDao.verificarMoneda(md);		
				 if(moneda==0){
					 valor = Constantes.COD_MONEDA_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.MONEDA_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}			
			if(flag){					
				 if(!validarEstadoE(i.getUeEnvio())){ 					
					 valor = Constantes.COD_UE_ENVIO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ENVIO_NO_EXISTE_CERT_CAB;
					 flag =false;					
				 }	 
			}			
			if(flag){				
				 if(!validarEstadoES(i.getUeEstado())){  
					 valor = Constantes.COD_UE_ESTADO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ESTADO_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			
			/**VALIDACION DE CAMPOS DE CERT_DET COMPROMISO ANUAL ANULACION**/
			for(CertDet d :detLista){
				 if(flag){
					 int  det  = certDetDao.verificarSecuencialDet(d);
					 if(det >0 && flag){
						 valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){				
					 if(!i.getSecuencial().equals(d.getSecuencial())){
						 valor = Constantes.COD_SECUENCIAL_NO_COINCIDE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_NO_COINCIDE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){
					 mc = new MaestroClasificador();
					 mc.setIdClasifi(d.getIdClasifi()); 
					 int  idClasifi  = maestroClasificadorDao.verificarIdClasifi(mc);		
					 if(idClasifi==0){
						 valor = Constantes.COD_ID_CLASIFI_NO_EXISTE_CERT_DET+"/"+
						         Constantes.ID_CLASIFI_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				}
				if(flag){
					 me = new Meta();
					 me.setAnoEje(i.getAnoEje()); 
					 me.setSecEjec(i.getSecEjec());
					 me.setSecFunc(d.getSecFunc()); 
					 int  secFunc  = metaDao.verificarExiteSecFunc(me);		
					 if(secFunc==0){								
						 valor = Constantes.COD_SEC_FUNC_NO_EXISTE_CERT_DET+"/"+
							     Constantes.SEC_FUNC_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
			   } 
			   if(flag){
					 mc = new MaestroClasificador();
					 mc.setAnoEje(i.getAnoEje());
					 mc.setClasificad(d.getClasifniv1()+d.getClasifniv2()+
							 " "+d.getClasifniv3()+" "+d.getClasifniv4()+
							 " "+d.getClasifniv5()+" "+d.getClasifniv6());
					 int  nivClasificad  = maestroClasificadorDao.verificarNivClasifi(mc);		
					 if(nivClasificad==0){
						 valor = Constantes.COD_CLASIFNIVELES_NO_EXISTE_CERT_DET+"/"+
						         Constantes.CLASIFNIVELES_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
				}			   
			}//fin del for				
			/*if(flag){				
				List<CertificadoSecuencia> certMonto = certificadoSecuenciaDao.bucarMontoTotalCert(cert);
				 logger.info("Monto Total compromiso anual por anulacion:  "+montoTotal); 
				 logger.info("Monto Total compromiso anual por anulacion bd:  "+certMonto.get(0).getMonto()); 
				if(certMonto.get(0).getMonto()!=montoTotal){ 
					valor = Constantes.COD_MONTO_DET_MAYOR_MONTO_CERT+"/"+
					        Constantes.MONTO_DET_MAYOR_MONTO_CERT;
					flag =false;				
				}	 
			} 
			if(flag){				
				List<CertificadoSecuencia> certMontoMn =certificadoSecuenciaDao.bucarMontoMnTotalCert(cert);
				logger.info("Monto Mn compromiso anual por anulacion:  "+montoMnTotal); 
				 logger.info("Monto Mn compromiso anual por anulacion bd:  "+certMontoMn.get(0).getMontoNaci()); 
				if(certMontoMn.get(0).getMontoNaci()!=montoMnTotal){ 
					valor = Constantes.COD_MONTOMN_DET_MAYOR_MONTO_CERT+"/"+
					        Constantes.MONTOMN_DET_MAYOR_MONTO_CERT;
					flag =false;				
				}	 
			}*/
			if(flag){				
				List<CertificadoFase> certMontoMn =certificadoFaseDao.bucarMontoMnTotalCert(certF);
				logger.info("Monto Mn Total compromiso anual por anulacion :  "+montoMnTotal); 
				logger.info("Monto MN Total compromiso anual por anulacion bd:  "+certMontoMn.get(0).getSaldoNaci());
				if(certMontoMn.get(0).getSaldoNaci()!=montoMnTotal){ 
					valor = Constantes.COD_MONTOMN_DET_MAYOR_MONTO_CERT+"/"+
					        Constantes.MONTOMN_DET_MAYOR_MONTO_CERT;
					flag =false;				
				}	 
			} 	
		} catch (Exception ex) {			
			logger.info("Error validar compromiso anual por anulacion"+ex); 
			valor = CODIGO_VERIFICACION_ERROR+"/"+"";
		}finally{
			if(i!=null){
				 i = null;	
			}
			if(detLista!=null){
				detLista =null;
			}
			if(cert!=null){
				cert =null;
			}
			if(e!=null){
			   e=null;
			}
			if(m !=null){
				m =null;
			}			
			if(md!=null){
				md =null;
			}
			if(f !=null){
				f=null;
			}		
			if(mc !=null){
				mc=null;
			}
			if(me !=null){
				me=null;
			}
			if(certF!=null){
				certF =null;
			}
		}		 
		 return valor;
	}
	
	/**validar compromiso anual  por Rebaja*/	
	@Override
	@SuppressWarnings("unchecked")
	public String validarCompromisoAnualRebaja(Map<String, Object> params) throws Exception {
		 String  valor  = CODIGO_VERIFICACION_OK+"/"+""; 
		 boolean flag = true;
		 CertCab i=null;
		 List<CertDet> detLista =null;
		 CertificadoSecuencia cert =null;
		 Ejecutora e =null;
		 MaestroDocumento m =null;
		 FuenteFinanc f =null;
		 MaestroDetalle md = null;
		 MaestroClasificador mc =null;
		 Meta me = null;
		 CertificadoFase certF=null;
		 try {
			 i = (CertCab) params.get("certCab");	    
			 detLista = (List<CertDet>) params.get("listaDet");
		     
		    // double montoTotal = (Double)params.get("montoTotal")*(-1);
		     double montoMnTotal = (Double)params.get("montoMnTotal")*(-1);
		     
			 /**VALIDACION DE CAMPOS DE CERT_CAB COMPROMISO ANUAL POR REBAJA**/
		     cert = new CertificadoSecuencia();			
			 cert.setCorrelativ(i.getIntfCor());
			 cert.setSecuencia(i.getIntfSec());
			 cert.setAnoEje(i.getAnoEje());		
			 cert.setCertificad(i.getIntfCer()); 
			 cert.setCodDoc(i.getCodDoc());
			 cert.setNumDoc(i.getNumDoc());
			 cert.setSecEjec(i.getSecEjec());
			 
			 certF = new CertificadoFase();
			 certF.setSecuencia(i.getIntfSec());
			 certF.setAnoEje(i.getAnoEje());		
			 certF.setCertificad(i.getIntfCer());			
			 certF.setSecEjec(i.getSecEjec()); 
			 
			 
		    if(flag){				
				 int numCertif = certificadoSecuenciaDao.verificarExiteCompromisoAnual(cert);	 					
				 if(numCertif==0){ 
					 valor = Constantes.COD_EXISTE_COMPROMISO_ANUAL_PROCESOS+"/"+
					         Constantes.EXISTE_COMPROMISO_ANUAL_PROCESOS;
					 flag =false;
				 }	 
			}				
			if(flag){
				 int  cab = certCabDao.verificarSecuencialCab(i);
				 if(cab >0){
					valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_CAB+"/"+
					        Constantes.SECUENCIAL_EXISTE_CERT_CAB;
					flag =false;
				 }		
			}
			if(flag){
				 e = new Ejecutora();
				 e.setAnoEje(i.getAnoEje()); 
				 int  anoEje  = maestroDetalleDao.verificarAnoEje(e);				
				 if(anoEje ==0){
					 valor = Constantes.COD_ANO_EJE_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ANO_EJE_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 e = new Ejecutora();
				 e.setSecEjec(i.getSecEjec()); 
			     int  secEje  = maestroDetalleDao.verificarSecEje(e);				
				 if(secEje==0){
					 valor = Constantes.COD_SEC_EJEC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.SEC_EJEC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}			
			if(flag){								
				 if(!Constantes.ES_COMP_ANUAL_SI.equalsIgnoreCase(i.getEsComp())){ 					
					 valor = Constantes.COD_ES_COMP_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ES_COMP_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }					
			}	
			if(flag){
				 m = new MaestroDocumento();
				 m.setCodDoc(i.getCodDoc()); 
				 int  codDoc  = maestroDocumentoDao.verificarCodDoc(m); 				
				 if(codDoc==0){
					 valor = Constantes.COD_COD_DOC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.COD_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){				 
				 int  numDoc  = certificadoSecuenciaDao.verificarExiteCertificadoNumDoc(cert);				
				 if(numDoc!=0){					
					valor = Constantes.COD_NUM_DOC_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.NUM_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 logger.info("Ingresando a buscar fecha de doc en certificado secuencial"); 
				 List<CertificadoSecuencia>  certifi  = certificadoSecuenciaDao.bucarFechaDocCert(cert);
				 logger.info("Fecha de doc en certificado secuencial es: "+certifi.get(0).getFechaDoc());
				 logger.info("Fecha de doc ingresado es: "+i.getFecDoc());
				 if(i.getFecDoc().before(certifi.get(0).getFechaDoc())){
					logger.info("La fecha ingresada es menor a la fecha de certificado"); 
					valor = Constantes.COD_FEC_DOC_MAYOR_CERT_CAB+"/"+
					        Constantes.FEC_DOC_MAYOR_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 f = new FuenteFinanc();
				 f.setFuenteFin(i.getFteFin()); 
				 int  fteFin  = fuenteFinancDao.verificarFteFin(f);	
				 if(fteFin==0){
					 valor = Constantes.COD_FTE_FIN_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.FTE_FIN_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}				
			if(flag){
				 md = new MaestroDetalle();
				 md.setCodDetall(i.getMoneda()); 
				 int  moneda  = maestroDetalleDao.verificarMoneda(md);		
				 if(moneda==0){
					 valor = Constantes.COD_MONEDA_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.MONEDA_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}		
			if(flag){					
				 if(!validarEstadoE(i.getUeEnvio())){ 					
					 valor = Constantes.COD_UE_ENVIO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ENVIO_NO_EXISTE_CERT_CAB;
					 flag =false;					
				 }	 
			}			
			if(flag){				
				 if(!validarEstadoES(i.getUeEstado())){  
					 valor = Constantes.COD_UE_ESTADO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ESTADO_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			
			 /**VALIDACION DE CAMPOS DE CERT_DET COMPROMISO ANUAL POR REBAJA**/
			for(CertDet d :detLista){
				if(flag){
					 int  det  = certDetDao.verificarSecuencialDet(d);
					 if(det >0 && flag){
						 valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){				
					 if(!i.getSecuencial().equals(d.getSecuencial())){
						 valor = Constantes.COD_SECUENCIAL_NO_COINCIDE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_NO_COINCIDE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){
					 mc = new MaestroClasificador();
					 mc.setIdClasifi(d.getIdClasifi()); 
					 int  idClasifi  = maestroClasificadorDao.verificarIdClasifi(mc);		
					 if(idClasifi==0){
						 valor = Constantes.COD_ID_CLASIFI_NO_EXISTE_CERT_DET+"/"+
						         Constantes.ID_CLASIFI_NO_EXISTE_INTF_DET09;
						 flag =false;
						 break;
					 }	 
				}
				if(flag){
					 me = new Meta();
					 me.setAnoEje(i.getAnoEje()); 
					 me.setSecEjec(i.getSecEjec());
					 me.setSecFunc(d.getSecFunc()); 
					 int  secFunc  = metaDao.verificarExiteSecFunc(me);		
					 if(secFunc==0){								
						 valor = Constantes.COD_SEC_FUNC_NO_EXISTE_CERT_DET+"/"+
							     Constantes.SEC_FUNC_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
			   } 
			   if(flag){
					 mc = new MaestroClasificador();
					 mc.setAnoEje(i.getAnoEje());
					 mc.setClasificad(d.getClasifniv1()+d.getClasifniv2()+
							 " "+d.getClasifniv3()+" "+d.getClasifniv4()+
							 " "+d.getClasifniv5()+" "+d.getClasifniv6());
					 int  nivClasificad  = maestroClasificadorDao.verificarNivClasifi(mc);		
					 if(nivClasificad==0){
						 valor = Constantes.COD_CLASIFNIVELES_NO_EXISTE_CERT_DET+"/"+
						         Constantes.CLASIFNIVELES_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
				}		  
			}//fin del for			
			/*if(flag){				
				List<CertificadoSecuencia> certMonto = certificadoSecuenciaDao.bucarMontoTotalCert(cert);
				logger.info("Monto Total compromiso anual por rebaja :  "+montoTotal); 
				logger.info("Monto Total compromiso anual por rebaja cerificado:  "+certMonto.get(0).getMonto()); 
				if(certMonto.get(0).getMonto()<=montoTotal){ 
					valor = Constantes.COD_MONTO_DET_MAYOR_MONTO_CERT+"/"+
					        Constantes.MONTO_DET_MAYOR_MONTO_CERT;
					flag =false;				
				}	 
			} 	*/		
			if(flag){				
				List<CertificadoFase> certMontoMn =certificadoFaseDao.bucarMontoMnTotalCert(certF);
				logger.info("Monto Mn Total compromiso anual por rebaja :  "+montoMnTotal); 
				logger.info("Monto MN Total compromiso anual por rebaja bd:  "+certMontoMn.get(0).getSaldoNaci());
				if(certMontoMn.get(0).getSaldoNaci()<=montoMnTotal){ 
					valor = Constantes.COD_MONTOMN_DET_MAYOR_MONTO_CERT_REBAJA+"/"+
					        Constantes.MONTOMN_DET_MAYOR_MONTO_CERT_REBAJA;
					flag =false;				
				}	 
		   } 			
		} catch (Exception ex) {		
			logger.info("Error validar compromiso anual por rebaja "+ex); 
			valor = CODIGO_VERIFICACION_ERROR+"/"+"";
		}finally{
			if(i!=null){
				 i = null;	
			}
			if(detLista!=null){
				detLista =null;
			}
			if(cert!=null){
				cert =null;
			}
			if(e!=null){
			   e=null;
			}
			if(m !=null){
				m =null;
			}			
			if(md!=null){
				md =null;
			}
			if(f !=null){
				f=null;
			}		
			if(mc !=null){
				mc=null;
			}
			if(me !=null){
				me=null;
			}
			if(certF!=null){
				certF =null;
			}
		}
		 return valor;
	}
	
	/**validar compromiso anual  por ampliacion*/	
	@Override
	@SuppressWarnings("unchecked")
	public String validarCompromisoAnualAmpl(Map<String, Object> params) throws Exception {
		 String  valor  = CODIGO_VERIFICACION_OK+"/"+""; 
		 boolean flag = true;
		 CertCab i=null;
		 List<CertDet> detLista =null;
		 CertificadoSecuencia cert =null;
		 Ejecutora e =null;
		 MaestroDocumento m =null;
		 FuenteFinanc f =null;
		 MaestroDetalle md = null;
		 MaestroClasificador mc =null;
		 Meta me = null;
		 CertificadoFase certF =null;
		 try {
			 i = (CertCab) params.get("certCab");   	    
			 detLista = (List<CertDet>) params.get("listaDet");	
		     
		    // double montoTotal = (Double)params.get("montoTotal")*(-1);
		     double montoMnTotal = (Double)params.get("montoMnTotal");
		     
			 /**VALIDACION DE CAMPOS DE CERT_CAB COMPROMISO ANUAL POR AMPLIACION**/
		     cert = new CertificadoSecuencia();			
			 cert.setCorrelativ(i.getIntfCor());
			 cert.setSecuencia(i.getIntfSec());
			 cert.setAnoEje(i.getAnoEje());		
			 cert.setCertificad(i.getIntfCer()); 
			 cert.setCodDoc(i.getCodDoc());
			 cert.setNumDoc(i.getNumDoc());
			 cert.setSecEjec(i.getSecEjec()); 
			 
			 certF = new CertificadoFase();
			 certF.setSecuencia("0001");
			 certF.setAnoEje(i.getAnoEje());		
			 certF.setCertificad(i.getIntfCer());			
			 certF.setSecEjec(i.getSecEjec()); 
			 
			 
			if(flag){				
				 int numCertif = certificadoSecuenciaDao.verificarExiteCompromisoAnual(cert);	 					
				 if(numCertif==0){ 
					 valor = Constantes.COD_EXISTE_COMPROMISO_ANUAL_PROCESOS+"/"+
					         Constantes.EXISTE_COMPROMISO_ANUAL_PROCESOS;
					 flag =false;
				 }	 
			}				
			if(flag){
				 int  cab = certCabDao.verificarSecuencialCab(i);
				 if(cab >0){
					valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_CAB+"/"+
					        Constantes.SECUENCIAL_EXISTE_CERT_CAB;
					flag =false;
				 }		
			}
			if(flag){
				 e = new Ejecutora();
				 e.setAnoEje(i.getAnoEje()); 
				 int  anoEje  = maestroDetalleDao.verificarAnoEje(e);				
				 if(anoEje ==0){
					 valor = Constantes.COD_ANO_EJE_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ANO_EJE_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 e = new Ejecutora();
				 e.setSecEjec(i.getSecEjec()); 
			     int  secEje  = maestroDetalleDao.verificarSecEje(e);				
				 if(secEje==0){
					 valor = Constantes.COD_SEC_EJEC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.SEC_EJEC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){								
				 if(!Constantes.ES_COMP_ANUAL_SI.equalsIgnoreCase(i.getEsComp())){ 					
					 valor = Constantes.COD_ES_COMP_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.ES_COMP_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }					
			}	
			if(flag){
				 m = new MaestroDocumento();
				 m.setCodDoc(i.getCodDoc()); 
				 int  codDoc  = maestroDocumentoDao.verificarCodDoc(m); 				
				 if(codDoc==0){
					 valor = Constantes.COD_COD_DOC_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.COD_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){				 
				 int  numDoc  = certificadoSecuenciaDao.verificarExiteCertificadoNumDoc(cert);				
				 if(numDoc!=0){					
					valor = Constantes.COD_NUM_DOC_NO_EXISTE_CERT_CAB+"/"+
					        Constantes.NUM_DOC_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 logger.info("Ingresando a buscar fecha de doc en certificado secuencial"); 
				 List<CertificadoSecuencia>  certifi  = certificadoSecuenciaDao.bucarFechaDocCert(cert);
				 logger.info("Fecha de doc en certificado secuencial es: "+certifi.get(0).getFechaDoc());
				 logger.info("Fecha de doc ingresado es: "+i.getFecDoc());
				 if(i.getFecDoc().before(certifi.get(0).getFechaDoc())){
					logger.info("La fecha ingresada es menor a la fecha de certificado"); 
					valor = Constantes.COD_FEC_DOC_MAYOR_CERT_CAB+"/"+
					        Constantes.FEC_DOC_MAYOR_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){
				 f = new FuenteFinanc();
				 f.setFuenteFin(i.getFteFin()); 
				 int  fteFin  = fuenteFinancDao.verificarFteFin(f);	
				 if(fteFin==0){
					 valor = Constantes.COD_FTE_FIN_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.FTE_FIN_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}				
			if(flag){
				 md = new MaestroDetalle();
				 md.setCodDetall(i.getMoneda()); 
				 int  moneda  = maestroDetalleDao.verificarMoneda(md);		
				 if(moneda==0){
					 valor = Constantes.COD_MONEDA_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.MONEDA_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			if(flag){					
				 if(!validarEstadoE(i.getUeEnvio())){ 					
					 valor = Constantes.COD_UE_ENVIO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ENVIO_NO_EXISTE_CERT_CAB;
					 flag =false;					
				 }	 
			}			
			if(flag){				
				 if(!validarEstadoES(i.getUeEstado())){  
					 valor = Constantes.COD_UE_ESTADO_NO_EXISTE_CERT_CAB+"/"+
					         Constantes.UE_ESTADO_NO_EXISTE_CERT_CAB;
					 flag =false;
				 }	 
			}
			
			 /**VALIDACION DE CAMPOS DE CERT_DET COMPROMISO ANUAL POR AMPLIACION**/
			for(CertDet d :detLista){
				if(flag){
					 int  det  = certDetDao.verificarSecuencialDet(d);
					 if(det >0 && flag){
						 valor = Constantes.COD_SECUENCIAL_EXISTE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){				
					 if(!i.getSecuencial().equals(d.getSecuencial())){
						 valor = Constantes.COD_SECUENCIAL_NO_COINCIDE_CERT_DET+"/"+
						         Constantes.SECUENCIAL_NO_COINCIDE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				 }
				 if(flag){
					 mc = new MaestroClasificador();
					 mc.setIdClasifi(d.getIdClasifi()); 
					 int  idClasifi  = maestroClasificadorDao.verificarIdClasifi(mc);		
					 if(idClasifi==0){
						 valor = Constantes.COD_ID_CLASIFI_NO_EXISTE_CERT_DET+"/"+
						         Constantes.ID_CLASIFI_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }	 
				}
				if(flag){
					 me = new Meta();
					 me.setAnoEje(i.getAnoEje()); 
					 me.setSecEjec(i.getSecEjec());
					 me.setSecFunc(d.getSecFunc()); 
					 int  secFunc  = metaDao.verificarExiteSecFunc(me);		
					 if(secFunc==0){								
						 valor = Constantes.COD_SEC_FUNC_NO_EXISTE_CERT_DET+"/"+
							     Constantes.SEC_FUNC_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
			   } 
			   if(flag){
					 mc = new MaestroClasificador();
					 mc.setAnoEje(i.getAnoEje());
					 mc.setClasificad(d.getClasifniv1()+d.getClasifniv2()+
							 " "+d.getClasifniv3()+" "+d.getClasifniv4()+
							 " "+d.getClasifniv5()+" "+d.getClasifniv6());
					 int  nivClasificad  = maestroClasificadorDao.verificarNivClasifi(mc);		
					 if(nivClasificad==0){
						 valor = Constantes.COD_CLASIFNIVELES_NO_EXISTE_CERT_DET+"/"+
						         Constantes.CLASIFNIVELES_NO_EXISTE_CERT_DET;
						 flag =false;
						 break;
					 }					
				}			   
			}//fin del for
			/*if(flag){				
				List<CertificadoSecuencia> certMonto = certificadoSecuenciaDao.bucarMontoTotalCert(cert);
				logger.info("Monto Total compromiso anual por ampliacion :  "+montoTotal); 
				logger.info("Monto Total compromiso anual por ampliacion bd:  "+certMonto.get(0).getMonto()); 
				if(certMonto.get(0).getMonto()<montoTotal){ 
					valor = Constantes.COD_MONTO_DET_MAYOR_MONTO_CERT+"/"+
					        Constantes.MONTO_DET_MAYOR_MONTO_CERT;
					flag =false;				
				}	 
			} */			
			if(flag){				
				List<CertificadoFase> certMontoMn =certificadoFaseDao.bucarMontoMnTotalCert(certF);
				logger.info("Monto Mn Total compromiso anual por ampliacion :  "+montoMnTotal); 
				logger.info("Monto MN Total compromiso anual por ampliacion bd:  "+certMontoMn.get(0).getSaldoNaci());
				if(certMontoMn.get(0).getSaldoNaci()<montoMnTotal){ 
					valor = Constantes.COD_MONTOMN_DET_MAYOR_MONTO_CERT_AMP+"/"+
					        Constantes.MONTOMN_DET_MAYOR_MONTO_CERT_AMP;
					flag =false;					
				}	 
		   } 	
		} catch (Exception ex) {			
			logger.info("Error validar compromiso anual por ampliacion "+ex); 
			valor = CODIGO_VERIFICACION_ERROR+"/"+"";
		}finally{
			if(i!=null){
				 i = null;	
			}
			if(detLista!=null){
				detLista =null;
			}
			if(cert!=null){
				cert =null;
			}
			if(e!=null){
			   e=null;
			}
			if(m !=null){
				m =null;
			}			
			if(md!=null){
				md =null;
			}
			if(f !=null){
				f=null;
			}		
			if(mc !=null){
				mc=null;
			}
			if(me !=null){
				me=null;
			}
			if(certF!=null){
				certF =null;
			}			
		}
		 return valor;
	}
	

}
